package yangsw87.service;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import yangsw87.interfaces.SungJukService;
import yangsw87.model.SungJukVO;

public class JDBCSungJuk implements SungJukService {

	// JDBC 접속 정보
	private static final String DRV = "oracle.jdbc.OracleDriver";
	private static final String URL = "jdbc:oracle:thin:@//localhost:1521/xe";
	private static final String USR = "scott";
	private static final String PWD = "TIGER";

	// SQL문 작성
	private static final String insertSQL = " insert into sungjuk(sjno, name, kor, eng, mat) "
			+ " VALUES(SJNO.nextval, ?,?,?,?)";
	private static final String selectSQL = " select * from sungjuk order by sjno desc ";

	private static final String updateSQL = " update sungjuk set name=?,kor=?,eng=?,mat=? where sjno=? ";

	private static final String deletesql = " delete from sungjuk where sjno = ? ";

	@Override
	public boolean newSungJuk(SungJukVO sj) {
		Connection conn = null;
		PreparedStatement ps = null;
		boolean result = false;
			// 성공적으로 추가 되었는지 확인용

		try {
			Class.forName(DRV);
			conn = DriverManager.getConnection(URL, USR, PWD);
			ps = conn.prepareStatement(insertSQL);
			// ? 매개변수에 들어갈 실제 값을 지정
			ps.setString(1, sj.getName()); // SungJukVO에서 이름값을 불러온다.
			ps.setInt(2, sj.getKor()); // SungJukVO에서 국어점수값을 불러온다.
			ps.setInt(3, sj.getEng()); // SungJukVO에서 영어점수값을 불러온다.
			ps.setInt(4, sj.getMat()); // SungJukVO에서 수학점수값을 불러온다.
			
			int cnt = ps.executeUpdate();
			// 성공적으로 insert 되면 result를 true로
			if (cnt > 0)
				result = true;
			// cnt는 성공적으로 executeIpdate();를 몇번 실행하였는지

		} catch (Exception ex) {
			ex.printStackTrace(); // 오류 저장
		} finally {
			if (ps != null)
				try {
					ps.close();
				} catch (Exception e) {
				}
			if (conn != null)
				try {
					conn.close();
				} catch (Exception e) {
				}
		}
		return result;
	}

	@Override
	public String readSungJuk() {
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		String result = "";

		try {
			Class.forName(DRV);
			conn = DriverManager.getConnection(URL, USR, PWD);
			ps = conn.prepareStatement(selectSQL);
			rs = ps.executeQuery();

			// selectSQL 실행결과를 모두 출력
			while (rs.next()) {
				for (int i = 1; i <= 9; ++i) {
					result += rs.getString(i) + "  ";
				}
				result += "\n";
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally { // 위에 try안에 들어있는 변수의 순서의 역순으로 닫아야 하기때문에 순서가 중요함!
			if (rs != null)
				try {
					rs.close();
				} catch (Exception e) {
				}
			if (ps != null)
				try {
					ps.close();
				} catch (Exception e) {
				}
			if (conn != null)
				try {
					conn.close();
				} catch (Exception e) {
				}
		}
		return result;
	}

	@Override
	public boolean modifySungJuk(SungJukVO sj) {
		Connection conn =null;
		PreparedStatement ps = null;
		boolean result = false;
			// 성공적으로 수정되었는지 확인용
		
		try{
			Class.forName(DRV);
			conn = DriverManager.getConnection(URL, USR, PWD);
			ps = conn.prepareStatement(updateSQL);
			
			ps.setString(1, sj.getName()); // SungJukVO에서 이름값을 불러온다.
			ps.setInt(2, sj.getKor()); // SungJukVO에서 국어점수값을 불러온다.
			ps.setInt(3, sj.getEng()); // SungJukVO에서 영어점수값을 불러온다.
			ps.setInt(4, sj.getMat()); // SungJukVO에서 수학점수값을 불러온다.
			ps.setString(5, sj.getSjno()); // SungJukVO에서 번호값을 불러온다.
			
			int cnt = ps.executeUpdate();
			if(cnt>0)
				return true;
			
		} catch (Exception ex){
			ex.printStackTrace();
		} finally{
			if(ps!=null)
				try{
					ps.close();
				} catch (Exception ex){
				}
			if(conn!=null)
				try{
					conn.close();
				} catch (Exception ex){
				}
		}
		
		return result;
	}

	@Override
	public boolean removeSungJuk(String key) {
		Connection conn = null;
		PreparedStatement ps = null;
		boolean result = false;
			// 성공적으로 삭제되었는지 확인용
		
		try{
			Class.forName(DRV);
			conn = DriverManager.getConnection(URL, USR, PWD);
			ps = conn.prepareStatement(deletesql);
			
			ps.setString(1, key);
			// 첫번째 ? 자리에 들어갈 값 지정
			
			int cnt = ps.executeUpdate();
			// sql문 실행 후 결과 반환
			if (cnt>0) result = true;
			
		} catch (Exception ex){
			ex.printStackTrace();
		} finally {
			if (ps!=null)
				try{
					ps.close();
				} catch (Exception ex){
				}
			if (conn!=null)
				try{
					conn.close();
				} catch (Exception ex){
				}
		}
		
		return result;
	}

}
